using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using TAS.Widgets;

namespace TAS.Widgets
{
	public class DateTimePicker : System.Windows.Forms.DateTimePicker
	{
		private System.Windows.Forms.TextBox txtDateTime;
		private System.ComponentModel.IContainer components;

		private bool SetDate;
		private System.Windows.Forms.ErrorProvider ErrorMessage;
		private System.Windows.Forms.ToolTip Tooltip;

		private const int BTNWIDTH = 16;

		public enum dtpCustomExtensions
		{
			dtpLong = 0,
			dtpShort = 1,
			dtpTime = 2,
			dtpShortDateShortTimeAMPM = 3,
			dtpShortDateLongTimeAMPM = 4,
			dtpShortDateShortTime24Hour = 5,
			dtpShortDateLongTime24Hour = 6,
			dtpLongDateShortTimeAMPM = 7,
			dtpLongDateLongTimeAMPM = 8,
			dtpLongDateShortTime24Hour = 9,
			dtpLongDateLongTime24Hour = 10,
			dtpSortableDateAndTimeLocalTime = 11,
			dtpUTFLocalDateAndShortTimeAMPM = 12,
			dtpUTFLocalDateAndLongTimeAMPM = 13,
			dtpUTFLocalDateAndShortTime24Hour = 14,
			dtpUTFLocalDateAndLongTime24Hour = 15,
			dtpShortTimeAMPM = 16,
			dtpShortTime24Hour = 17,
			dtpLongTime24Hour = 18,
			dtpYearAndMonthName = 19,
			dtpMonthNameAndDay = 20,
			dtpYear4Digit = 21,
			dtpMonthFullName = 22,
			dtpMonthShortName = 23,
			dtpDayFullName = 24,
			dtpDayShortName = 25,
			dtpShortDateAMPM = 26,
			dtpShortDateMorningAfternoon = 27,
			dtpCustom = 28
	}

		private string mvarLinkedTo;
		private bool bDroppedDown;
		private int ButtonWidth = BTNWIDTH;
		private bool mvarShowButtons = true;
		private dtpCustomExtensions mvarFormatEx;
		private string mvarCustomFormatMessage;
		private int CheckWidth = 0;

		private TAS.Widgets.DateTimePicker LinkTo;
		private System.Collections.ArrayList LinkToArray = new System.Collections.ArrayList();
		private System.Collections.ArrayList LinkedArray = new System.Collections.ArrayList();

		#region Constructor and destructor

		public DateTimePicker()
		{
			// This call is required by the Windows.Forms Form Designer.
			InitializeComponent();

			// TODO: Add any initialization after the InitForm call
			//Initialise bas.Format to Custom, we only need Custom Format
			base.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
			DateTimePicker_Resize(this, null);

		}

		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if( components != null )
					components.Dispose();
			}
			base.Dispose( disposing );
		}

		#endregion Constructor and destructor

		#region Component Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify 
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
			this.components = new System.ComponentModel.Container();
			this.txtDateTime = new System.Windows.Forms.TextBox();
			this.ErrorMessage = new System.Windows.Forms.ErrorProvider();
			this.Tooltip = new System.Windows.Forms.ToolTip(this.components);
			this.SuspendLayout();
			// 
			// txtDateTime
			// 
			this.txtDateTime.Location = new System.Drawing.Point(20, 49);
			this.txtDateTime.MaxLength = 50;
			this.txtDateTime.Name = "txtDateTime";
			this.txtDateTime.TabIndex = 0;
			this.txtDateTime.Text = "";
			this.txtDateTime.BackColorChanged += new System.EventHandler(this.txtDateTime_BackColorChanged);
			this.txtDateTime.Leave += new System.EventHandler(this.txtDateTime_Leave);
			this.txtDateTime.Enter += new System.EventHandler(this.txtDateTime_Enter);
			// 
			// ErrorMessage
			// 
			this.ErrorMessage.DataMember = null;
			// 
			// DateTimePicker
			// 
			this.Controls.AddRange(new System.Windows.Forms.Control[] {this.txtDateTime});
			this.Value = new System.DateTime(1753, 1, 1, 15, 8, 40, 119);
			this.DropDown += new System.EventHandler(this.DateTimePicker_DropDown);
			this.FontChanged += new System.EventHandler(this.DateTimePicker_FontChanged);
			this.Resize += new System.EventHandler(this.DateTimePicker_Resize);
			this.Enter += new System.EventHandler(this.DateTimePicker_Enter);
			this.CloseUp += new System.EventHandler(this.DateTimePicker_CloseUp);
			this.ForeColorChanged += new System.EventHandler(this.DateTimePicker_ForeColorChanged);
			this.BackColorChanged += new System.EventHandler(this.DateTimePicker_BackColorChanged);
			this.ValueChanged += new System.EventHandler(this.FormatOrValueChanged);
			this.FormatChanged += new System.EventHandler(this.FormatOrValueChanged);
			this.ResumeLayout(false);

		}
		#endregion

		#region overriden and additional properties

		//OverRide Formst and hide it by setting Browsable false, make it read only
		//so it can't be written to, it will always be Custom anyway
		[Browsable(false)]
		public new System.Windows.Forms.DateTimePickerFormat Format
		{
			get
			{
				return base.Format;
			}
			//set
			//{
			//	base.Format = value;
			//}
		}

		//FormatEx, extends the formatting options by allowing additional selections
		//Replaces Format
		[Browsable(true), Category("Appearance"), Description("Format Extensions replaces Format gets sets display Formats")]
		public dtpCustomExtensions FormatEx
		{
			get
			{
				return mvarFormatEx;
			}
			set
			{
				mvarFormatEx = value;
				InitialiseCustomMessage();
			}
		}

		//New Property, allows hiding of DropDown Button and Updown Button
		[Browsable(true), Category("Appearance"), Description("Hides DropDown and Spin Buttons, Allows keyed entry only.")] 
		public bool ShowButtons
		{
			get
			{
				return mvarShowButtons;
			}
			set
			{
				//Do not allow Set Show Buttons when ReadOnly is true
				//all Buttons and Chexkbox are hidden when Control is Read Only
				if (!this.ReadOnly)
				{
					mvarShowButtons = value;
					if (mvarShowButtons)
					{
						ButtonWidth = BTNWIDTH;
					}
					else
					{
						ButtonWidth = 0;
					}
					DateTimePicker_Resize(this, null);
				}
			}
		}

		//Overrides base.ShowCheckBox
		[Browsable(true), Category("Appearance"), Description("Hides DropDown and Spin Buttons, Allows keyed entry only.")]
		public new bool ShowCheckBox
		{
			get
			{
				return base.ShowCheckBox;
			}
			set
			{
				//Do not allow set ShowCheckBox when ReadOnly is True
				//all Buttons and Chexkbox are hidden when Control is Read Only
				if (!this.ReadOnly)
				{
					base.ShowCheckBox = value;
					if (base.ShowCheckBox)
					{
						CheckWidth = BTNWIDTH;
					}
					else
					{
						CheckWidth = 0;
					}
					DateTimePicker_Resize(this,null);
				}
			}
		}
		
		//overrie Text, we want to set Get Textbox Text
		[Browsable(true), Category("Behavior"), Description("Date and Time displayed")]
		public new string Text
		{
			get
			{
				return txtDateTime.Text;
			}
			set
			{
				txtDateTime.Text = value;
				//Don't bother Formatting the Textbox if it's value is NullString
				//It will cause problems if you do
				if (value != "")
				{
					FormatTextBox();
				}
			}
		}

		//Override bas.ShowUpDown
		[Browsable(true), Category("Appearance"), Description("Uses Updown control to select dates instead of Dropdown control")]
		public new bool ShowUpDown
		{
			get
			{
				return base.ShowUpDown;
			}
			set
			{
				//Do not allow set ShowUpDown when ReadOnly is True
				//all Buttons and Checkbox are hidden when Control is Read Only
				if (!this.ReadOnly)
				{
					base.ShowUpDown = value;
					txtDateTime.Text = "";
				}
			}
		}

		//Override Textbox back Colour so we can add it to the Appearance List
		//and use it to set the BG colour
		[Browsable(true), Category("Appearance"), Description("The Backround Colour user to display Text and Graphics in this Control")]
		public new System.Drawing.Color BackColor
		{
			get
			{
				return base.BackColor;
			}
			set
			{
				base.BackColor = value;
			}
		}

		//New Property Read Only makes it possible to set Textbox to read only
		[Browsable(true), Category("Behavior"), Description("Used to set whether the control can be edited")]
		public bool ReadOnly
		{
			get
			{
				return txtDateTime.ReadOnly;
			}
			set
			{
				//If ReadOnly is true make sure ShowCheckBox, ShowUpDown and ShowButtons 
				//are false.
				//all Buttons and Checkbox are hidden when Control is Read Only
				//Be aware of the order these properties are set
				if (value)
				{
					this.ShowCheckBox = false;
					this.ShowUpDown = false;
					this.ShowButtons = false;
					txtDateTime.ReadOnly = value;
				}
				else
				{
					txtDateTime.ReadOnly = value;
					this.ShowButtons = true;
				}
			}
		}

		//New Property Makes it possible to link control to another Datetimepicker
		[Browsable(true), Category("Behavior"), Description("Set Get another Date Picker Control that this control receives data from.")]
		public string LinkedTo
		{
			get
			{
				return mvarLinkedTo;
			}
			set
			{
				mvarLinkedTo = value;
				LinkedArray.Clear();
				if (mvarLinkedTo != "" && mvarLinkedTo != null)
				{
					string[] splitmvarLinkedTo = mvarLinkedTo.Split(",".ToCharArray());
					for (int i = 0; i < splitmvarLinkedTo.Length; i++)
					{	
						LinkedArray.Add(splitmvarLinkedTo[i].Trim());
					}
				}
			}
		}

		#endregion

		#region DateTimePicker events

		private void DateTimePicker_Resize(object sender, System.EventArgs e)
		{
			this.txtDateTime.Location = new System.Drawing.Point(-2 + CheckWidth, -2);
			this.txtDateTime.Size = new System.Drawing.Size(this.Width - ButtonWidth - CheckWidth, this.Height);
		}

		private void DateTimePicker_FontChanged(Object sender  , System.EventArgs e  ) 
		{
			//Make sure TextBox Font =  Dtp Font
			txtDateTime.Font = this.Font;
		}

		private void DateTimePicker_BackColorChanged(Object sender  , System.EventArgs e  )
		{
			//Make sure TextBox BackColour =  Dtp Back Colour
			txtDateTime.BackColor = this.BackColor;
		}

		private void txtDateTime_BackColorChanged(Object sender  , System.EventArgs e  )
		{
			//Make sure DTP BackColour =  TextBox Back Colour
			if (txtDateTime.BackColor != this.BackColor)
			{
				this.BackColor = txtDateTime.BackColor;
			}
		}

		private void DateTimePicker_ForeColorChanged(Object sender  ,System.EventArgs  e  )
		{
			//Make sure TextBox Fore Colour =  Dtp Fore Colour
			txtDateTime.ForeColor = this.BackColor;
		}

		private void FormatOrValueChanged(Object sender, System.EventArgs e  ) 
		{
			ErrorMessage.SetError(this, "");

			//if dtp Value changed 
			//Attempt to Format the TextBox String if Text is not NullString
			if (this.Text != "" )
			{
				try
				{
					FormatTextBox();
				}
				catch
				{
					ErrorMessage.SetError(this, "Invalid Date - " + txtDateTime.Text + ", valid format is " + mvarCustomFormatMessage);
				}
			}
		}

		private void txtDateTime_Enter(Object sender, System.EventArgs e  ) 
		{
			Tooltip.SetToolTip(txtDateTime, mvarCustomFormatMessage);

			if (txtDateTime.Text.Length > 0 )
			{
				txtDateTime.SelectionStart = 0;
				txtDateTime.SelectionLength = txtDateTime.Text.Length;
			}

			SetDate = true;
			this.Value = DateTime.Now;
			SetDate = false;
		}

		private void txtDateTime_Leave(Object sender, System.EventArgs e ) 
		{
			if (! SetDate )
			{
				SetDate = true;

				ErrorMessage.SetError(this, "");

				//Attempt to Format the TextBox String if Text is not NullString
				if (this.Text != "" )
				{
					try
					{
						FormatTextBox();
						//if Link To is Not nullString
						//Attempt to Link to the Specified LinkTo Controls
						LinkToArray.Clear();
						if (mvarLinkedTo != "" && mvarLinkedTo != null)
						{
							for (int j = 0; j < LinkedArray.Count; j++)
							{
								for (int i = 0; i < this.Parent.Controls.Count; i++)
								{
									if (this.Parent.Controls[i].Name == LinkedArray[j].ToString() && this.Parent.Controls[i] is TAS.Widgets.DateTimePicker)
									{
										LinkTo = (TAS.Widgets.DateTimePicker)this.Parent.Controls[i];
										LinkToArray.Add(LinkTo);
										break;
									}
								}
							}
						}
					}
					catch 
					{
						ErrorMessage.SetError(this, "Invalid Date - " + txtDateTime.Text + ", valid format is " + mvarCustomFormatMessage);
					}
				}

				//IF the LinkTo Object has been instantiated it's ok to attempt to set it's Text Value
				for (int i = 0; i < LinkToArray.Count; i++)
				{
					if (this.LinkToArray[i] != null)
					{
						LinkTo = (TAS.Widgets.DateTimePicker)LinkToArray[i];
						LinkTo.Text = this.Text;
					}
				}

				SetDate = false;
			}
		}

		private void DateTimePicker_Enter(Object sender  ,System.EventArgs  e  )
		{
			txtDateTime.Focus();
		}

		private void DateTimePicker_DropDown(Object sender  , System.EventArgs  e ) 
		{
			bDroppedDown = true;
		}

		private void DateTimePicker_CloseUp(object sender, System.EventArgs e)
		{
			if (bDroppedDown || this.ShowUpDown )
			{
				if (! SetDate )
				{
					txtDateTime.Text = this.Value.ToString();
					FormatTextBox();
					bDroppedDown = false;
					txtDateTime.Focus();
				}
			}
		}
	
		protected override void OnValueChanged(System.EventArgs eventargs  )
		{
			
			
			if (bDroppedDown || this.ShowUpDown )
			{
				if (! SetDate )
				{
					txtDateTime.Text = this.Value.ToString();
					FormatTextBox();
				}
			}
		}
		
		//Set up the message that will diplay in the Tooltip
		//when the mouse is hovered over the control
		private void InitialiseCustomMessage()
		{
			switch (mvarFormatEx)
			{
				case dtpCustomExtensions.dtpCustom:
					mvarCustomFormatMessage = this.CustomFormat;
					break;
				case dtpCustomExtensions.dtpLong:
					mvarCustomFormatMessage = "Long Date (" + DateTime.Now.ToLongDateString() + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpShort:
					mvarCustomFormatMessage = "Short Date (" + DateTime.Now.ToShortDateString() + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpTime:
					mvarCustomFormatMessage = "Long Time AM/PM (" + DateTime.Now.ToLongTimeString() + ")";
					this.CustomFormat = "HH:mm:ss yyyy-MM-dd ";
					break;
				case dtpCustomExtensions.dtpDayFullName:
					mvarCustomFormatMessage = "Day of the Week Full Name (" + DateTime.Now.ToString("dddd", Application.CurrentCulture) + ")";
					this.CustomFormat = "dd-MM-yyyy HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpDayShortName:
					mvarCustomFormatMessage = "Day of the Week Short Name (" + DateTime.Now.ToString("ddd", Application.CurrentCulture) + ")";
					this.CustomFormat = "dd-MM-yyyy HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpLongDateLongTime24Hour:
					mvarCustomFormatMessage = "Long Date Long Time 24 Hour (" + DateTime.Now.ToString("D", Application.CurrentCulture) + " " + DateTime.Now.ToString("HH:mm:ss", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpLongDateLongTimeAMPM:
					mvarCustomFormatMessage = "Long Date Long Time AM/PM (" + DateTime.Now.ToString("D", Application.CurrentCulture) + " " + DateTime.Now.ToString("hh:mm:ss tt", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpLongDateShortTime24Hour:
					mvarCustomFormatMessage = "Long Date Short Time 24 Hour (" + DateTime.Now.ToString("D", Application.CurrentCulture) + " " + DateTime.Now.ToString("HH:mm", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpLongDateShortTimeAMPM:
					mvarCustomFormatMessage = "Long Date Short Time AM/PM (" + DateTime.Now.ToString("D", Application.CurrentCulture) + " " + DateTime.Now.ToString("hh:mm tt", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpLongTime24Hour:
					mvarCustomFormatMessage = "Long Time 24 Hour (" + DateTime.Now.ToString("HH:mm:ss", Application.CurrentCulture) + ")";
					this.CustomFormat = "HH:mm:ss yyyy-MM-dd ";
					break;
				case dtpCustomExtensions.dtpMonthFullName:
					mvarCustomFormatMessage = "Month Full Name (" + DateTime.Now.ToString("MMMM", Application.CurrentCulture) + ")";
					this.CustomFormat = "MM-dd-yyyy HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpMonthNameAndDay:
					mvarCustomFormatMessage = "Month Name and Day (" + DateTime.Now.ToString("M", Application.CurrentCulture) + ")";
					this.CustomFormat = "dd-MM-yyyy HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpMonthShortName:
					mvarCustomFormatMessage = "Month Short Name (" + DateTime.Now.ToString("MMM", Application.CurrentCulture) + ")";
					this.CustomFormat = "MM-dd-yyyy HH:mm:ss";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpShortDateLongTime24Hour:
					mvarCustomFormatMessage = "Short Date Long Time 24 Hour (" + DateTime.Now.ToString("d", Application.CurrentCulture) + " " + DateTime.Now.ToString("HH:mm:ss", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpShortDateLongTimeAMPM:
					mvarCustomFormatMessage = "Short Date Long Time AM/PM (" + DateTime.Now.ToString("G", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpShortDateShortTime24Hour:
					mvarCustomFormatMessage = " Short Date Short Time 24 Hour (" + DateTime.Now.ToString("d", Application.CurrentCulture) + " " + DateTime.Now.ToString("HH:mm", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpShortDateShortTimeAMPM:
					mvarCustomFormatMessage = " Short Date Short Time AM/PM (" + DateTime.Now.ToString("d", Application.CurrentCulture) + " " + DateTime.Now.ToString("hh:mmss tt", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpShortTime24Hour:
					mvarCustomFormatMessage = "Short Time 24 Hour (" + DateTime.Now.ToString("HH:mm", Application.CurrentCulture) + ")";
					this.CustomFormat = "HH:mm:ss yyyy-MM-dd ";
					break;
				case dtpCustomExtensions.dtpShortTimeAMPM:
					mvarCustomFormatMessage = "Short Time AM/PM (" + DateTime.Now.ToString("hh:mm tt", Application.CurrentCulture) + ")";
					this.CustomFormat = "HH:mm:ss yyyy-MM-dd ";
					break;
				case dtpCustomExtensions.dtpSortableDateAndTimeLocalTime:
					mvarCustomFormatMessage = "Sortable Date and Local Time (" + DateTime.Now.ToString("s", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case dtpCustomExtensions.dtpUTFLocalDateAndLongTime24Hour:
					mvarCustomFormatMessage = "UTF Local Date and Long Time 24 Hour (" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case  dtpCustomExtensions.dtpUTFLocalDateAndLongTimeAMPM:
					mvarCustomFormatMessage = "UTF Local Date and Long Time AM/PM (" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss tt", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case  dtpCustomExtensions.dtpUTFLocalDateAndShortTime24Hour:
					mvarCustomFormatMessage = "UTF Local Date and Short Time 24 Hour (" + DateTime.Now.ToString("yyyy-MM-dd HH:mm", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case  dtpCustomExtensions.dtpUTFLocalDateAndShortTimeAMPM:
					mvarCustomFormatMessage = "UTF Local Date and Short Time AM/PM (" + DateTime.Now.ToString("yyyy-MM-dd HH:mm tt", Application.CurrentCulture) + ")";
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case  dtpCustomExtensions.dtpYear4Digit:
					mvarCustomFormatMessage = "4 Digit Year (" + DateTime.Now.ToString("yyyy", Application.CurrentCulture);
					this.CustomFormat = "yyyy-MM-dd HH:mm:ss";
					break;
				case  dtpCustomExtensions.dtpYearAndMonthName:
					mvarCustomFormatMessage = "Year and Month Name (" + DateTime.Now.ToString("Y", Application.CurrentCulture) + ")";
					this.CustomFormat = "MM-dd-yyyy HH:mm:ss";
					break;
				case  dtpCustomExtensions.dtpShortDateAMPM:
					mvarCustomFormatMessage = "Short Date AM/PM (" + DateTime.Now.ToString("d", Application.CurrentCulture) + " " + DateTime.Now.ToString("tt", Application.CurrentCulture) + ")";
					this.CustomFormat = "MM-dd-yyyy HH:mm:ss";
					break;
				case  dtpCustomExtensions.dtpShortDateMorningAfternoon:
					string AMPM = "AM";
					if (DateTime.Now.Hour >= 12)
					{
						AMPM = "Afternoon";
					}
					mvarCustomFormatMessage = "Short Date Morning/Afternoon (" + DateTime.Now.ToString("d", Application.CurrentCulture) + " " + AMPM + ")";
					this.CustomFormat = "MM-dd-yyyy HH:mm:ss";
					break;
			}
			Tooltip.SetToolTip(txtDateTime, mvarCustomFormatMessage);
		}

		//Dispplay dates Times etc, based on Format selected
		private void FormatTextBox()
		{

			switch (mvarFormatEx)
			{
				case dtpCustomExtensions.dtpCustom:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString(this.CustomFormat, Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpDayFullName:
					try
					{
						this.Value = DateTime.Parse(txtDateTime.Text);
					}
					catch
					{
						int aDay;
						DateTime aDate;
						for (aDay = 1; aDay < 8; aDay++)
						{
							aDate = DateTime.Parse(DateTime.Now.Year.ToString() + "-01-" + aDay.ToString());
							if (aDate.DayOfWeek.ToString().ToLower() == txtDateTime.Text.ToLower() || aDate.DayOfWeek.ToString().Substring(0, 3).ToLower() == txtDateTime.Text.ToLower())
							{
								this.Value = DateTime.Parse(DateTime.Now.Year.ToString() + "-01-" + aDay.ToString());
								break;
							}
						}
					}
					txtDateTime.Text = this.Value.ToString("dddd", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpDayShortName:
					try
					{
						this.Value = DateTime.Parse(txtDateTime.Text);
					}
					catch
					{
						int aDay;
						DateTime aDate;
						for (aDay = 1; aDay < 8; aDay++)
						{
							aDate = DateTime.Parse(DateTime.Now.Year.ToString() + "-01-" + aDay.ToString());
							if (aDate.DayOfWeek.ToString().ToLower() == txtDateTime.Text.ToLower() || aDate.DayOfWeek.ToString().Substring(0, 3).ToLower() == txtDateTime.Text.ToLower())
							{
								this.Value = DateTime.Parse(DateTime.Now.Year.ToString() + "-01-" + aDay.ToString());
								break;
							}
						}
					}
					txtDateTime.Text = this.Value.ToString("ddd", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpLongDateLongTime24Hour:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("D", Application.CurrentCulture) + " " + this.Value.ToString("HH:mm:ss", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpLongDateLongTimeAMPM:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("D", Application.CurrentCulture) + " " + this.Value.ToString("hh:mm:ss tt", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpLongDateShortTime24Hour:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("D", Application.CurrentCulture) + " " + this.Value.ToString("HH:mm", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpLongDateShortTimeAMPM:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("D", Application.CurrentCulture) + " " + this.Value.ToString("hh:mm tt", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpLongTime24Hour:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("HH:mm:ss", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpMonthFullName:
					try
					{
						this.Value = DateTime.Parse(txtDateTime.Text);
					}
					catch
					{
						int aMonth;
						DateTime aDate;
						string[] sMonth = new string[]{"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; 
						for (aMonth = 0; aMonth < 12; aMonth++)
						{
							aDate = DateTime.Parse(DateTime.Now.Year.ToString() + "-" + (aMonth + 1) + "-" + "01");
							if (sMonth[aMonth].ToLower() == txtDateTime.Text.ToLower() || sMonth[aMonth].ToLower() == txtDateTime.Text.Substring(0, 3).ToLower())
							{
								this.Value = DateTime.Parse(DateTime.Now.Year.ToString() + "-"+ (aMonth + 1) + "-" + "01");
								break;
							}
						}
					}
					txtDateTime.Text = this.Value.ToString("MMMM", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpMonthShortName:
					try
					{
						this.Value = DateTime.Parse(txtDateTime.Text);
					}
					catch
					{
						int aMonth;
						DateTime aDate;
						string[] sMonth = new string[]{"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; 
						for (aMonth = 0; aMonth < 12; aMonth++)
						{
							aDate = DateTime.Parse(DateTime.Now.Year.ToString() + "-" + (aMonth + 1) + "-" +  "01");
							if (sMonth[aMonth].ToLower() == txtDateTime.Text.ToLower() || sMonth[aMonth].ToLower() == txtDateTime.Text.Substring(0, 3).ToLower())
							{
								this.Value = DateTime.Parse(DateTime.Now.Year.ToString() + "-"+ (aMonth + 1) + "-" + "01");
								break;
							}
						}
					}
					txtDateTime.Text = this.Value.ToString("MMM", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpMonthNameAndDay:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("M", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpShortDateLongTime24Hour:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("d", Application.CurrentCulture) + " " + this.Value.ToString("HH:mms:ss", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpShortDateLongTimeAMPM:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("d", Application.CurrentCulture) + " " + this.Value.ToString("hh:mms:ss tt", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpShortDateShortTime24Hour:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("d", Application.CurrentCulture) + " " + this.Value.ToString("HH:mm", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpShortDateShortTimeAMPM:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("d", Application.CurrentCulture) + " " + this.Value.ToString("hh:mms tt", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpShortTime24Hour:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("HH:mm", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpShortTimeAMPM:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("hh:mm tt", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpSortableDateAndTimeLocalTime:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("s", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpUTFLocalDateAndLongTime24Hour:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("yyyy-MM-dd", Application.CurrentCulture) + " " + this.Value.ToString("HH:mm:ss", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpUTFLocalDateAndLongTimeAMPM:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("yyyy-MM-dd", Application.CurrentCulture) + " " + this.Value.ToString("hh:mm:ss tt", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpUTFLocalDateAndShortTime24Hour:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("yyyy-MM-dd", Application.CurrentCulture) + " " + this.Value.ToString("HH:mm", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpUTFLocalDateAndShortTimeAMPM:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("yyyy-MM-dd", Application.CurrentCulture) + " " + this.Value.ToString("hh:mm tt", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpYear4Digit:
					try
					{
						this.Value = DateTime.Parse(txtDateTime.Text);
					}
					catch
					{
						this.Value = DateTime.Parse("01 01 " + txtDateTime.Text);
					} 
					txtDateTime.Text = this.Value.ToString("yyyy", Application.CurrentCulture);
					break;
				case dtpCustomExtensions.dtpYearAndMonthName:
					try
					{
						this.Value = DateTime.Parse(txtDateTime.Text);
					}
					catch
					{
						try
						{
							txtDateTime.Text = DateTime.Now.Year.ToString() + " " + int.Parse(txtDateTime.Text, Application.CurrentCulture).ToString();
						}
						catch
						{
							this.Value = DateTime.Parse(txtDateTime.Text + " 01" );
						}
					}
					txtDateTime.Text = this.Value.ToString("Y", Application.CurrentCulture);
					break;
				case  dtpCustomExtensions.dtpShortDateAMPM:
					if (txtDateTime.Text.Substring(txtDateTime.Text.Length - 2, 2).ToLower() == "pm")
					{
						txtDateTime.Text = txtDateTime.Text.Substring(0, txtDateTime.Text.Length - 2);
						txtDateTime.Text = txtDateTime.Text + " 13:00";
					}
					else
					{
						if (txtDateTime.Text.Substring(txtDateTime.Text.Length - 2, 2).ToLower() == "am")
						{
							txtDateTime.Text = txtDateTime.Text.Substring(0, txtDateTime.Text.Length - 2);
						}
						txtDateTime.Text = txtDateTime.Text + " 01:00";
					}
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToString("d", Application.CurrentCulture) + " " + this.Value.ToString("tt", Application.CurrentCulture);
					break;
				case  dtpCustomExtensions.dtpShortDateMorningAfternoon:
					string AMPM = "Morning";
					if (txtDateTime.Text.Substring(txtDateTime.Text.Length - 2, 2).ToLower() == "pm")
					{
						txtDateTime.Text = txtDateTime.Text.Substring(0, txtDateTime.Text.Length - 2);
						txtDateTime.Text = txtDateTime.Text + " 13:00";
					}
					else
					{
						if (txtDateTime.Text.Substring(txtDateTime.Text.Length - 2, 2).ToLower() == "am")
						{
							txtDateTime.Text = txtDateTime.Text.Substring(0, txtDateTime.Text.Length - 2);
						}
						txtDateTime.Text = txtDateTime.Text + " 01:00";
					}
					this.Value = DateTime.Parse(txtDateTime.Text);
					if (this.Value.Hour >= 12)
					{
						AMPM = "Afternoon";
					}
					txtDateTime.Text = this.Value.ToString("d", Application.CurrentCulture) + " " + AMPM;
					break;
				case dtpCustomExtensions.dtpLong:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToLongDateString();
					break;
				case dtpCustomExtensions.dtpShort:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToShortDateString();
					break;
				case dtpCustomExtensions.dtpTime:
					this.Value = DateTime.Parse(txtDateTime.Text);
					txtDateTime.Text = this.Value.ToLongTimeString();
					break;
				default:
					break;
			}
		}

		#endregion

	}
}
